﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasDesktop.UILogic.Helpers;

namespace GestorDeFlotasDesktop
{
    public partial class FormRol : BaseForm
    {
        private Int64 CurrentUserId { get; set; }
        private FormMode Mode { get; set; } 

        public FormRol()
        {
            InitializeComponent();
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                base.OnVisibleChanged(e);
                PrepareForm(this.Mode);
                if (lsFuncionalidades.Items.Count <= 0)
                    this.CargarFuncionalidades();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarFuncionalidades()
        {
                lsFuncionalidades.DisplayMember = "Nombre";
                lsFuncionalidades.ValueMember = "Id";
                lsFuncionalidades.DataSource = Transaccion.Factoria<FactoriaFuncionalidad>().SelectTodos<Funcionalidad>();
        }

        private List<Funcionalidad> GetSelectedFuncionalidades()
        {
            try
            {
                List<Funcionalidad> roles = new List<Funcionalidad>();
                foreach (object item in lsFuncionalidades.SelectedItems)
                {
                    roles.Add((Funcionalidad)item);
                }
                return roles;
            }
            catch (Exception)
            {
                return new List<Funcionalidad>();
            }
        }
        private bool ValidateFields()
        {
            bool error = false;
            string errorMessage = string.Empty;

            if (!ValidatorHelper.isStringFieldValid(txtNombreRol.Text) && Mode == FormMode.Add)
            {
                errorMessage = "No ingresaste el nombre del rol\n";
                error = true;
            }
            else
            {
                List<Rol> roles = Transaccion.Factoria<FactoriaRol>().SelectPorRolName(txtNombreRol.Text);

                if (this.Mode == FormMode.Update) roles = roles.Where(u => u.Id != this.CurrentUserId).ToList<Rol>();

                if (roles.Count > 0)
                {
                    error = true;
                    errorMessage = "El rol ingresado ya existe \n";
                }
            }

            if (!ValidatorHelper.isListBoxFieldValid(lsFuncionalidades))
            {
                errorMessage += "No seleccionaste ninguna funcionalidad para el rol \n";
                error = true;
            }

            lblError.Text = errorMessage;
            lblError.Visible = error;

            return error;
        }

        private void ResetFields()
        {
            txtNombreRol.Text = lblError.Text = string.Empty;
            lblError.Visible = false;
        }

        private void PrepareForm(FormMode mode)
        {
            if (mode == FormMode.Add)
            {
                lblHabilitado.Visible = false;
                chkEnabled.Visible = false;
                btnAddOrUpdate.Text = "Agregar";
            }
            else
            {
                lblHabilitado.Visible = true;
                chkEnabled.Visible = true;
                btnAddOrUpdate.Text = "Modificar";
            }
        }

        private void LoadData(Rol rol)
        {
            Rol rolPosta = Transaccion.Factoria<FactoriaRol>().SelectXId<Rol>(rol.Id.ToString());
            txtNombreRol.Text = rolPosta.Nombre;
            chkEnabled.Checked = rolPosta.Habilitado;
            List<Funcionalidad> funcionalidades = rolPosta.Funcionalidades;
            List<Funcionalidad> todas = Transaccion.Factoria<FactoriaFuncionalidad>().SelectTodos<Funcionalidad>();
            foreach (Funcionalidad func in funcionalidades)
            {
                lsFuncionalidades.SelectedItems.Add(func);
            }
        }

        private void btnAddOrUpdate_Click(object sender, EventArgs e)
        {
            try
            {

                if (!ValidateFields())
                {
                    if (Mode == FormMode.Add)
                    {
                        //Creo el nuevo rol
                        List<Funcionalidad> funcionalidades = GetSelectedFuncionalidades();
                        Rol rol = Transaccion.Factoria<FactoriaRol>().Nuevo(txtNombreRol.Text,
                                                                            true,
                                                                            funcionalidades);
                        Transaccion.Persistir();

                        funcionalidades.ForEach(f => Transaccion.Factoria<FactoriaFuncionalidadPorRol>().Nuevo(f, rol));

                        Transaccion.Persistir();
                    }
                    else
                    {
                        if (CurrentUserId <= 0)
                            lblError.Text += "No hay ningún rol seleccionado";
                        else
                        {
                            Rol rol = Transaccion.Factoria<FactoriaRol>().SelectXId<Rol>(CurrentUserId.ToString());

                            rol.Habilitado = chkEnabled.Checked;
                            rol.Funcionalidades = GetSelectedFuncionalidades();
                            Transaccion.Persistir();
                        }
                    }
                    if (String.IsNullOrEmpty(lblError.Text))
                    {
                        AbmRol.AbmRol list = new AbmRol.AbmRol();
                        list.Show();
                        this.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }



        public void LoadForm(FormMode mode, Rol rol)
        {

            this.Mode = mode;
            ResetFields();
            PrepareForm(mode);
            if (mode == FormMode.Add) this.CurrentUserId = 0;
            else
            {
                LoadData(rol);
                this.CurrentUserId = rol.Id;
            }
        }
    }
}
